编辑 感谢您的及时回复。请看看真正的问题是什么。这次我把它变得大胆了。
我确实理解 == 和 .equals 之间的区别。所以,这不是我的问题(我实际上为此添加了一些上下文)
我正在对空字符串执行以下验证:
if( "" == value ) { // is empty string }
过去从数据库中获取值或从另一个节点反序列化对象时,此测试失败,因为两个字符串实例确实是不同的对象引用,尽管它们包含相同的数据。
所以解决这些情况的方法是
if( "".equals( value ) ) { // which returns true for all the empty strings }
我很好。这很清楚。
今天再次发生这种情况,但让我感到困惑,因为这次应用程序是一个非常小的独立应用程序,根本不使用网络,所以没有从数据库中获取新字符串,也没有从另一个节点反序列化。
所以问题是:
"" == value // yields false
和
"".equals( value ) // yields true
对于本地独立应用程序?
我很确定代码中没有使用new String() 。
字符串引用可能是“”的唯一方法是因为它是直接在代码中分配的“”(或者这就是我的想法),例如:
String a = ""; String b = a; assert "" == b ; // this is true
不知何故(在阅读了更多代码之后,我有了一个线索)创建了两个不同的空字符串对象引用,我想知道如何
jjnguys 回答中的更多内容:
字节!
编辑:结论
我找到了原因。
在 jjnguy 建议之后,我能够以不同的眼光看待代码。
有罪的方法:StringBuilder.toString()
分配并初始化一个新的 String 对象以包含该对象当前表示的字符序列。
嗬!…
StringBuilder b = new StringBuilder("h"); b.deleteCharAt( 0 ); System.out.println( "" == b.toString() ); // prints false
谜团已揭开。
该代码使用 StringBuilder 来处理不断增长的字符串。事实证明,在某些时候有人这样做了:
public void someAction( String string ) { if( "" == string ) { return; } deleteBankAccount( string ); }
并使用
someAction( myBuilder.toString() ); // bug introduced.
ps 我最近是不是看太多 CodingHorror 了?或者为什么我觉得有必要在这里添加一些有趣的动物图片?
String s = ""; String s2 = someUserInputVariale.toLowercase(); // where the user entered in ""
这样的事情会导致s == s2评估为假。
s == s2
许多代码仍然会创建新Strings的而不暴露对new String().
Strings
new String()